package co.kr.caja.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.kr.caja.entidad.PersonaDTO;
import co.kr.caja.entidad.UsuarioDTO;

public class UsuarioDAOSqlServer {

	private String crearUsuarioSQL;
	private String actualizarUsuarioSQL;
	private String consultarUsuarioCodigoSQL;
	private String consultarUsuarioUsuarioSQL;
	private String consultarUsuarioTodoSQL;

	public UsuarioDAOSqlServer() {
		crearUsuarioSQL = "";
		actualizarUsuarioSQL = "";
		consultarUsuarioCodigoSQL = "";
		consultarUsuarioUsuarioSQL = "";
		consultarUsuarioTodoSQL = "";
	}

	public void crear(UsuarioDTO usuarioDTO, Connection conexion) throws SQLException {
		crearUsuarioSQL = "INSERT INTO Usuario (codigo_persona, usuario, clave) VALUES (?, ?, ?)";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(crearUsuarioSQL)) {
			sentenciaPreparada.setInt(1, usuarioDTO.getPersonaDTO().getCodigoPersona());
			sentenciaPreparada.setString(2, usuarioDTO.getUsuario());
			sentenciaPreparada.setString(3, usuarioDTO.getClave());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un probema creando el registro en la tabla Usuario: " + excepcion.getMessage());
			throw excepcion;
		}
	}

	public void actualizar(UsuarioDTO usuarioDTO, Connection conexion) throws SQLException {
		actualizarUsuarioSQL = "UPDATE Usuario SET codigo_persona = ISNULL(?, codigo_persona), usuario = ISNULL(?, usuario), clave = ISNULL(?, clave) WHERE codigo_usuario = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(actualizarUsuarioSQL)) {
			sentenciaPreparada.setInt(1, usuarioDTO.getPersonaDTO().getCodigoPersona());
			sentenciaPreparada.setString(2, usuarioDTO.getUsuario());
			sentenciaPreparada.setString(3, usuarioDTO.getClave());
			sentenciaPreparada.setInt(4, usuarioDTO.getCodigoUsuario());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema actualizando el registro en la tabla Usuario: " + excepcion.getMessage());
			throw excepcion;
		}
	}

	public UsuarioDTO consultarPorCodigo(UsuarioDTO usuarioDTO, Connection conexion) throws SQLException {
		UsuarioDTO usuarioDTOResultado = null;
		consultarUsuarioCodigoSQL = "SELECT codigo_usuario, codigo_persona, usuario, clave FROM Usuario WHERE codigo_usuario = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarUsuarioCodigoSQL)) {
			sentenciaPreparada.setInt(1, usuarioDTO.getCodigoUsuario());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					usuarioDTOResultado = new UsuarioDTO();
					usuarioDTOResultado.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					PersonaDTO personaDTO = new PersonaDTO();
					personaDTO.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					usuarioDTOResultado.setPersonaDTO(personaDTO);
					usuarioDTOResultado.setUsuario(cursorResultado.getString("usuario"));
					usuarioDTOResultado.setClave(cursorResultado.getString("usuario"));
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Usuario por codigo: " + excepcion.getMessage());
			throw excepcion;
		}
		return usuarioDTOResultado;
	}

	public UsuarioDTO consultarPorUsuario(UsuarioDTO datosUsuario, Connection conexion) throws SQLException {
		UsuarioDTO datosUsuarioResultado = null;
		consultarUsuarioUsuarioSQL = "SELECT codigo_usuario, codigo_persona, usuario, clave FROM Usuario WHERE usuario = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarUsuarioUsuarioSQL)) {
			sentenciaPreparada.setInt(1, datosUsuario.getCodigoUsuario());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					datosUsuarioResultado = new UsuarioDTO();
					datosUsuarioResultado.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					PersonaDTO personaDTO = new PersonaDTO();
					personaDTO.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					datosUsuarioResultado.setPersonaDTO(personaDTO);
					datosUsuarioResultado.setUsuario(cursorResultado.getString("usuario"));
					datosUsuarioResultado.setClave(cursorResultado.getString("clave"));
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Usuario por usuario: " + excepcion.getMessage());
			throw excepcion;
		}
		return datosUsuarioResultado;
	}

	public ArrayList<UsuarioDTO> consultarTodo(Connection conexion) throws SQLException {
		ArrayList<UsuarioDTO> usuarioDTOLista = new ArrayList<UsuarioDTO>();
		UsuarioDTO usuarioDTOResultado = null;
		consultarUsuarioTodoSQL = "SELECT codigo_usuario, codigo_persona, usuario, clave FROM Usuario";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarUsuarioTodoSQL)) {
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				while (cursorResultado.next()) {
					usuarioDTOResultado = new UsuarioDTO();
					usuarioDTOResultado.setCodigoUsuario(cursorResultado.getInt("codigo_usuario"));
					PersonaDTO personaDTO = new PersonaDTO();
					personaDTO.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					usuarioDTOResultado.setPersonaDTO(personaDTO);
					usuarioDTOResultado.setUsuario(cursorResultado.getString("usuario"));
					usuarioDTOResultado.setClave(cursorResultado.getString("clave"));
					usuarioDTOLista.add(usuarioDTOResultado);
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultado toda la tabla Usuario: " + excepcion.getMessage());
			throw excepcion;
		}
		return usuarioDTOLista;
	}
}
